<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>


    <script>
        //原型     1 

        // function A(name) {
        //     this.name = name;
        // }

        // function B() {

        // }

        // B.prototype = A.prototype; //1.单继承
        // B.prototype.constructor = B; //1.
        // B.prototype.eat = "吃"; //3.父类也会被添加

        // var b = new B("xixi") //2.不能传值
        // console.dir(A)



        // function A(name) {
        //     this.name = name;
        // }

        // function B() {

        // }

        // B.prototype = new A(); //1.单继承
        // B.prototype.constructor = B; //1.
        // B.prototype.eat = "吃";

        // var b = new B("xixi") //2.不能传值
        // console.dir(A)

        //借用构造函数继承   缺点:无法父类原型上的属性和方法
        // function A(name){
        //    this.name = name;
        // }
        // function C(){
        //     this.run = function(){
        //         console.log("running")
        //     }
        // }
        // A.prototype.eat = "吃"

        // function B(){
        //   A.call(this,arguments[0])
        //   C.call(this)
        // }
        // let b = new B("xixi");



        //组合继承    //父类 2次，占内存
        // function A(name, age, sex) {
        //     this.name = name
        //     this.age = age
        //     this.sex = sex
        // }

        // function B(name, age, sex) {
        //     A.call(this, name, age, sex)
        // }
        // A.prototype.run = function() {
        //     console.log("running")
        // }
        // B.prototype = new A();

        // let b = new B("xixi", 20, "man")
        // console.log(b)

        // let a = new A();
        // console.log(a)

        //对象继承
        // let a = {
        //     name: "xixi"
        // };
        //1.
        // let b = {};
        // b.__proto__ = a;
        // console.log(b)

        //2.
        // let b = Object.create(a)
        // console.log(b)


        //3.
        // let b = {}

        // function F() {}
        // F.prototype = a;
        // b = new F();
        // console.log(b.name)

        //介质继承    中间商
        // function A(name) {
        //     this.name = name
        // }

        // A.prototype.eat = "吃"

        // function B() {}

        // function F() {}
        // F.prototype = A.prototype;
        // B.prototype = new F();

        // let b = new B("xixi");
        // console.log(b.eat);


        // function A(name) {
        //     this.name = name
        // }

        // A.prototype.eat = "吃"

        // function B() {}


        // function extend(Child, Parent) {
        //     function F() {}
        //     F.prototype = Parent.prototype;
        //     Child.prototype = new F();
        //     Child.prototype.constructor = Child;
        // }

        // extend(B, A)


        // let b = new B("xixi");
        // console.dir(b)
        // console.log(b.eat);


        //拷贝继承

        // function A() {
        //     this.name = "xixi"
        // }

        // A.prototype.eat = "吃";


        // function B() {}

        // function extend(child, parent) {
        //     var p = parent.prototype;
        //     var c = child.prototype;
        //     for (var key in p) {
        //         c[key] = p[key]
        //     }
        // }
        // extend(B, A)

        // let b = new B();
        // console.log(b.eat)


        //原型式继承   对象

        // let a = {
        //     name: "xxi"
        // };

        // function extend(o) {
        //     function F() {}
        //     F.prototype = o;
        //     return new F();
        // }

        // let b = extend(a);
        // console.log(b.name);


        //寄生式继承  对象

        // let a = {
        //     name: "xixi"
        // };

        // function extend(o) {
        //     function F() {};
        //     F.prototype = o;
        //     return new F();
        // };

        // function clone(o) {
        //     let x = extend(o);
        //     return x;

        // }
        // let b = clone(a);
        // console.log(b.name)

        //组合寄生式继承（完美继承）
        // function A() {
        //     this.name = "xixi"
        // }

        // function B() {
        //     A.call(this)
        // }

        // function extend(o) {
        //     function F() {}
        //     F.prototype = o;
        //     return new F();
        // }

        // function clone(child, parent) {
        //     var x = extend(parent.prototype);
        //     x.constructor = child;
        //     child.prototype = x;
        // }
        // clone(B, A);

        // let b = new B();
        // console.log(b.name);
    </script>
</body>

</html>